package com.atguigu.study.service.impl;

import com.atguigu.study.mapper.SystemUserMapper;
import com.atguigu.study.pojo.SystemUser;
import com.atguigu.study.service.SystemUserService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ClassName:SystemUserServiceImpl
 * Package: com.atguigu.study.service.impl
 * Description:
 *
 * @Author Makabaka
 * @Create 2024/9/13 18:22
 * @Version 1.0
 */
@Service
public class SystemUserServiceImpl implements SystemUserService {

    @Autowired
    SystemUserMapper systemUserMapper;
    //    操作redis
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    List<SystemUser> allUser;
    //    可以进行对象和字符串间的相互转化
    private static final ObjectMapper MAPPER = new ObjectMapper();
    //    想要操作redis必须给一个key  redis中以key-value存在
    String key = "APP:findAll";


    @Override
    public List<SystemUser> findAllUser() {

        //    第一次查询从数据库  之后将其添加到redis中  从数据库查出来的是对象，redis存的是String  需要进行转化  JSON正适合
        if (stringRedisTemplate.hasKey(key)) {
            long redisStartTime = System.currentTimeMillis();
//            不是第一次查询到  说明已经在redis中添加过数据  无需去数据库在查询  直接从redis中获取
            String result = stringRedisTemplate.opsForValue().get(key);

            long redisEndTime = System.currentTimeMillis();

            System.out.println("redis耗时" + (redisEndTime - redisStartTime) + "毫秒");
            try {
                // 将redis中得到的结果转为对象返回给请求调用处
                allUser = MAPPER.readValue(result, List.class);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }

        } else {
//            redis中不存在这个key  是第一次查询到 加入到redis中
            try {
                long mysqlStartTime = System.currentTimeMillis();

                allUser = systemUserMapper.findAllUser();

                long mysqlEndTime = System.currentTimeMillis();

                System.out.println("mysql耗时" + (mysqlEndTime - mysqlStartTime) + "毫秒");
                // 此方法是将对象转为字符串
                String value = MAPPER.writeValueAsString(allUser);
//            向redis中加入第一次查询到的数据结果
//                设置过期时间
                stringRedisTemplate.opsForValue().set(key, value,30, TimeUnit.MINUTES);

            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }

        }
        return allUser;
    }
}
